Amazon EC2 Container Service (ECS): ECSエージェントの動作を確認する
はじめに
本ブログではAmazon EC2 Container Service (ECS)について、これまでに以下の記事を書きました。
今回は、ECSクラスタを構成するECSエージェント(が導入されたEC2インスタンス)が、実際どんな動きになっているのかを確認してみました。
やってみた
ECSエージェントの導入方法
チュートリアルでは、ECS-Optimized Amazon Linux(amzn-ami-2014.09.1-amazon-ecs-optimized-preview2 - ami-34ddbe5c)をLaunchする際に、UserDataに以下のように記述するようにとなっています。
#!/bin/bash echo ECS_CLUSTER=MyCluster >> /etc/ecs/ecs.config
ECSエージェントの動き
ECSエージェントがセットアップされたEC2にログインしてみると、/etc/ecsの中に、UserDataで作成したecs.configがあります。
$ cd /etc/ecs $ ls -alF 合計 16 drwxr-xr-x 2 root root 4096 12月 19 02:04 ./ drwxr-xr-x 64 root root 4096 12月 19 02:04 ../ -rwxr-xr-x 1 root root 3658 12月 17 00:15 ecs-init* -rw-r--r-- 1 root root 22 12月 19 02:04 ecs.config
上記にあるecs-initが起動スクリプトです。これは/etc/init/ecs.confによってUpstartでdaemon化されてます。
$ cd /etc/init $ ls -alF | grep ecs -rwxr-xr-x 1 root root 794 12月 17 00:15 ecs.conf* $ sudo initctl list | grep ecs ecs start/running, process 2407
ecs-initにより、docker runが実行されています。
$ ps aux | grep "docker run" root 2422 0.0 0.6 218068 6528 ? Sl 02:05 0:00 docker run --name ecs-agent -v /var/run/docker.sock:/var/run/docker.sock -v /var/log/ecs:/log -p 127.0.0.1:51678:51678 --env-file /etc/ecs/ecs.config -e ECS_LOGFILE=/log/ecs-agent.log amazon/amazon-ecs-agent:latest $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3bee360f185a amazon/amazon-ecs-agent:latest "/agent" 5 minutes ago Up 5 minutes 127.0.0.1:51678->51678/tcp ecs-agent
ECSのログは/var/log/ecsに出力されています。
$ cd /var/log/ecs $ ls -alF 合計 28 drwxr-xr-x 2 root root 4096 12月 19 02:05 ./ drwxr-xr-x 6 root root 4096 12月 19 02:05 ../ -rw-r--r-- 1 root root 13037 12月 19 02:23 ecs-agent.log -rw-r--r-- 1 root root 306 12月 19 02:05 ecs-init.log
それぞれのログの内容はこんな感じ。
$ tail -5 ecs-agent.log t=2014-12-19T02:21:24+0000 lvl=info msg="Starting websocket poll loop" module=acs stack="[github.com/aws/amazon-ecs-agent/agent/acs/poll.go:112 agent/agent.go:82 github.com/aws/amazon-ecs-agent/agent/utils/utils.go:92 agent/agent.go:121]" t=2014-12-19T02:22:24+0000 lvl=dbug msg="Got a message from acs websocket" module=acs message="{\"type\":\"HeartbeatMessage\",\"message\":{\"healthy\":true}}" t=2014-12-19T02:22:24+0000 lvl=info msg="Message = " module=acs message="{MessageType:HeartbeatMessage Message:{Tasks:[] MessageId:}}" t=2014-12-19T02:22:24+0000 lvl=dbug msg="Unmarshalled message as" module=acs tasks=<nil> skip=true err=nil t=2014-12-19T02:23:07+0000 lvl=dbug msg="Got event from docker daemon" module=TaskEngine event="&{Status:die ID:6063a9c5a4e3e19c2f238aef511612c8c0cb9a93143cb26d044f24c5572de5e0 From:amazon/amazon-ecs-agent:latest Time:1418955787}" $ tail -5 ecs-init.log ecs-init [Fri Dec 19 02:05:00 UTC 2014]: pre-start ecs-init [Fri Dec 19 02:05:03 UTC 2014]: Loading Amazon EC2 Container Service Agent from file /var/cache/ecs/ecs-agent.tar ecs-init [Fri Dec 19 02:05:04 UTC 2014]: start ecs-init [Fri Dec 19 02:05:04 UTC 2014]: Starting Amazon EC2 Container Service Agent
このamazon/amazon-ecs-agentはDocker Hubにあります。
amazon-ecs-agentのソースはgithubで公開されています。
このGithubのREADMEに、Environment一覧があります。チュートリアルではECS_CLUSTERしか設定していませんが、ECS_LOGLEVELでログの出力レベルを変えたり、AWS_ACCESS_KEY_IDを設定してIAM Roleを使わずにECSエージェントを動かすことも出来ます。
このamazon-ecs-agetのDockerfileはamazon-ecs-agent/scripts/dockerfiles/にあります。Dockerfiles.buildでGolangで書かれたamazon-ecs-agentをbuildしており、Dockerfile.releaseでbuildされたバイナリを組み込んだscratchコンテナが定義されています。実際にamazon-ecs-agentのコンテナとして動くのはこのイメージなので、シングルバイナリなコンテナとして動いているようですね。
実際にdocker execしてみようとしたのですが、(当然ですが)psコマンドも無いような状態です。
$ sudo docker exec 3bee360f185a /bin/ps 2014/12/19 03:01:08 docker-exec: failed to exec: exec: "/bin/ps": stat /bin/ps: no such file or directory
さいごに
そもそもscratchを初めて知りました。こんな仕組みがあったんですね。ECSについては更に調査してみたいと思います!